#include"comm.hpp"

// 直接创建全局对象，生成管道文件
fifoCD fifo;

int main()
{
    // 获取key值
    key_t key = ftok(PATH, PROJ_ID);
    Log("server create key success", Debug);
    cout << "key ::" << deToHex(key) << endl;
    
    // server端创建出新的shm
    int shmid = shmget(key, SIZE, IPC_CREAT | IPC_EXCL | 0666);// 这里要给创建出来的shm权限，不然映射的时候会出问题
    if(shmid == -1)
    {
        Log("server shmget fail", Error);
        exit(1);
    }
    Log("server shmget sucess", Debug);
    cout << "shmid ::" << shmid << endl;
    // sleep(5);

    // server端与创建出的shm建立映射
    char* shmaddr = (char*)shmat(shmid, nullptr, 0);
    if(shmaddr == (char*)-1)
    {
        Log("server attach fail", Error);
        exit(3);
    }
    Log("server attach success", Debug);
    // sleep(5);


    // // ipc
    // while(true)
    // {
    //     // quit 就退出
    //     if(strcmp(shmaddr, "quit") == 0) break;

    //     write(1, shmaddr, strlen(shmaddr));
    //     sleep(1);
    // }

    // 通信前打开管道文件
    int fd = OpenFifo(FIFO_PATH, READ);// server读
    
    // ipc
    while(true)
    {
        // 读信息前先等待client发信号
        getSignal(fd);
        // 接收到信号才能读
        printf("client read:: %s\n", shmaddr);
        if(strcmp(shmaddr, "quit") == 0) 
        {
            Log("server quit", Debug);
            break; // 接收到quit就退出
        }
    }
    // 退出后关闭文件
    CloseFifo(fd);

    //server端与shm去掉映射
    if(shmdt(shmaddr) == -1)
    {
        Log("server detach fail", Error);
        exit(4);
    }
    Log("server detach success", Debug);

    //sleep(5);

    // server删除shm
    if(shmctl(shmid, IPC_RMID, nullptr) == -1)
    {
        Log("server del shm fail", Error);
        exit(2);
    }
    Log("server del shm success", Debug);

    // 进程退出
    Log("server quit", Debug);
    return 0;
}